#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
typedef struct {//定义栈的结构体
    int data[MAX_SIZE]; // 用于存储栈中的元素
    int top;           // 栈顶指针
} Stack;
void initialize(Stack *stack) {//初始化栈
    stack->top = -1;
}
bool isEmpty(Stack *stack) {//判断栈是否为空
    return stack->top == -1;
}
bool isFull(Stack *stack) {//.判断栈是否已满
    return stack->top == MAX_SIZE - 1;
}
void push(Stack *stack, int value) {//定义一个函数`push`，用于将元素压入栈中。
    if (isFull(stack)) {
        printf("Stack overflow! Cannot push %d\n", value);
        return;
    }
    stack->data[++stack->top] = value;
}
int pop(Stack *stack) {//定义一个函数`pop`，用于从栈中弹出元素。
    if (isEmpty(stack)) {
        printf("Stack underflow! Cannot pop from an empty stack\n");
        return -1; // 返回一个错误值
    }
    return stack->data[stack->top--];
}
int peek(Stack *stack) {//定义一个函数`peek`，用于查看栈顶元素
    if (isEmpty(stack)) {
        printf("Stack is empty! Cannot peek\n");
        return -1; // 返回一个错误值
    }
    return stack->data[stack->top];
}
int main() {
    Stack stack;
    initialize(&stack);
    //测试用例
    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("在压入 10、20、30 后，栈顶元素是  %d\n", peek(&stack));

    printf("第一次弹出操作从栈中移除了栈顶元素  %d\n", pop(&stack));
    printf("第二次弹出操作从栈中移除了新的栈顶元素  %d\n", pop(&stack));

    printf("栈顶元素是 %d\n", peek(&stack));

    return 0;
}